/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import java.util.ArrayList;
import javax.swing.JOptionPane;

/**
 *
 * @author root
 */
public class dijkstraMejorado {
    private int[][] entrada;
    private int[] costos;
    private int[] objetivos;
    private int filas;
    private int columnas;
    private ArrayList<String> ruta;

    public dijkstraMejorado(int[][] entrada, int[] objetivos){
        this.entrada=entrada;
        filas=entrada.length;
        this.objetivos=objetivos;
        columnas=entrada[0].length;
        costos=new int[columnas];
        ruta = new ArrayList<String>(500);

        //inicializa el arreglo costos
        for(int i=0;i<costos.length;i++){
            costos[i]=5000000;
        }
    }

    public void limpiar(){
        columnas=entrada[0].length;
        costos=new int[columnas];
        ruta = new ArrayList<String>(500);
        for(int i=0;i<costos.length;i++){
            costos[i]=5000000;
        }
    }

    public void calcular(int pivote){
        
        try{
        if(pivote>columnas)
            return;

        else{
            //calcula los costos iniciales y la ruta inicial
            for(int i=0;i<columnas;i++){
                if(entrada[pivote][i]<costos[i]){
                    costos[i]=entrada[pivote][i];
                    ruta.add(i,""+pivote);
                }

                else
                    ruta.add(i,"");
            }


            //el algoritmo  como tal
            for(int x=0;x<filas;x++){
                for(int j=0;j<filas;j++){
                    int lleva=costos[j];
                    for(int i=0;i<columnas;i++){
                        if(j!=pivote){
                            if((lleva+entrada[j][i])<costos[i]){
                                 ruta.set(i,""+j);
                                   costos[i]=lleva+entrada[j][i];
                            }
                        }
                    }
                }
            }

        for(int i=0;i<ruta.size();i++){
            ruta.set(i, (ruta.get(i)+" "+i));
            //System.out.println(ruta.get(i));
        }

        //listar las rutas
        int primero=0;
        for(int i=0;i<ruta.size();i++){
            primero = Integer.parseInt((ruta.get(i).charAt(0))+"");
            while(primero!=pivote){
                ruta.set(i, ruta.get(primero)+" "+ruta.get(i));
                primero = Integer.parseInt((ruta.get(i).charAt(0))+"");
            }
        }

//        imprimir la ruta de los objetivos
//        for(int i=0;i<objetivos.length;i++)
//            System.out.println(ruta.get(objetivos[i])+" ");

        //imprimir los costos de los objetivos
//        for(int i=0;i<objetivos.length;i++)
//            System.out.print(costos[objetivos[i]]+" ");
        }
        }catch(NumberFormatException nfe){
            JOptionPane.showMessageDialog(null,"No hay conexion entre los destinos NO SE PUEDE CONTINUAR");
        }
    }


    public int[][] crearMatriz(){
        int [][] salida = new int[filas][filas];
        try{
            for(int i=0;i<filas;i++)
            for(int j=0;j<filas;j++)
                salida[i][j]=0;

        int a=0;
        int b=0;
        for(int i=0;i<objetivos.length;i++){
            for(int j=0;j<(int)((ruta.get(objetivos[i]).length()/4)+(1/2));j++){
                a=Integer.parseInt(ruta.get(objetivos[i]).charAt(4*j)+"");
                b=Integer.parseInt(ruta.get(objetivos[i]).charAt(4*j+2)+"");
                salida[a][b]=1;
                salida[b][a]=1;
            }
        }
        
    
            }catch(NumberFormatException nfe){
         //   JOptionPane.showMessageDialog(null,"Hay un error mientras se establecia la matriz");
        }
        return salida;
    }
}
